#ifndef WIDGET_H
#define WIDGET_H

#include "gamerole.h"
#include "setback.h"
#include "award.h"
#include "gamescene.h"
#include <QObject>
#include <QWidget>
#include <QGraphicsPixmapItem>
#include <QTimer>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QPixmap>
#include <QPushButton>
#include <QFont>
#include <QGraphicsProxyWidget>
#include <QLabel>
#include <QMediaPlayer>
#include <QListWidget>
#include <QDialogButtonBox>
#include <QDialog>
#include <QSlider>
#include <QList>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    //按键事件：用键盘控制游戏人物的移动
    void keyPressEvent(QKeyEvent* event);
    void keyReleaseEvent(QKeyEvent* event);

private:
    //设置相关的数据
    bool isJumping = false;//人物是否跳跃
    bool canCreateSetBack = true;//是否能够产生障碍物
    bool canCreateAward = true;//是否能够产生奖励
    bool isGameover = false;//判断游戏是否结束
    int LeapSpeed = 0;//跳跃的速度
    qreal leapGravity = 1.7;//重力加速度

    //人物下蹲相关数据和函数
    //bool isCrouching = false;//人物是否下蹲
    //int crouchSpeed = 0;//下蹲的速度
    //qreal crouchGravity = 1.8;//下蹲的速度

    //容器设置
    QList<int> mKeyList;//设置按键组合
    QList<QPixmap> mRolePixmap;//设置不同运动状况下人物的形象转换
    QList<setBack*> setBackList;//设置障碍物组合
    QList<award*> awardList;//设置奖励组合
    QString rolePixmap[4]={
        ":/Icon/跑酷游戏/图片/奶龙素材PNG (2)_爱给网_aigei_com.png",//正常行走的人物形象
        ":/Icon/跑酷游戏/图片/nailongRoleLeap.png",//跳跃时的人物形象
        ":/Icon/跑酷游戏/图片/downToward.png",//设置附身运动的
        ":/Icon/跑酷游戏/图片/wudi_stituation.png"
    };//初始化照片容器

    //设置相关标签
    QLabel* roleLifeDisplay;//游戏人物生命值显示
    QLabel* roleAwardDisplay;//游戏人物奖励值显示
    QLabel* LineLabel;//游戏名字显示
    QLabel* gameInterpret1;//游戏说明1
    QLabel* gameInterpret2;//游戏说明2
    QLabel* musicLabel;//音乐设置标签
    QLabel* valueLabel;//音乐音量调节设置

    QPushButton* startBtn;//游戏开始按钮
    QPushButton* interpretBtn;//游戏说明按钮
    QPushButton* installBtn;//游戏设置按钮
    QPushButton* backBtn;//游戏说明中的 返回按钮
    QPushButton* backBtn1;//游戏设置中的 返回按钮
    QPushButton* backBtn2;//游戏运行界面中的 返回按钮
    QPushButton* musicStartBtn;//播放音乐按钮
    QPushButton* musicEndBtn;//停止播放音乐按钮

    //设立游戏视图和界面
    QGraphicsView mGameview;//游戏视图
    gameScene mGameScene;//游戏场景
    gameScene mStartScene;//开始游戏场景
    gameScene mGameInterpretScene;//游戏规则说明场景
    gameScene mGameInstallScene;//设置游戏设置场景

    // 设置游戏背景及其他元素
    QGraphicsPixmapItem mStartBGrole; // 设置开始游戏界面的人物
    QGraphicsPixmapItem mStartBackGround;//开始游戏背景
    QGraphicsPixmapItem mStartLine;//设置开始游戏的游戏标题
    QGraphicsPixmapItem mGameInterpretBackGround;//游戏说明背景
    QGraphicsPixmapItem mGameInstallBackground;//设置游戏设置背景
    QGraphicsPixmapItem mGameBackGround1;//游戏背景1
    QGraphicsPixmapItem mGameBackGround2;//游戏背景2

    gameRole mRole;//设置游戏人物

    //设置背景音乐
    QMediaPlayer* mStartMediaBG;//游戏背景音乐1
    QMediaPlayer* mStartMediaBG1;//游戏背景音乐2
    QMediaPlayer* mGameoverMediaBG;//游戏失败音效
    QMediaPlayer* mRoleCollisionMedia;//障碍物碰撞音效
    QMediaPlayer* mRoleCollisionAwardMedia;//奖励碰撞音效
    QSlider* musicSlider;//设置音乐音量滑动条

    //设置各种计时器
    QTimer* mRoleMoveTimer;//人物移动计时器
    QTimer* jumpTimer;//跳跃计时器
    //QTimer* crouchTimer;//下蹲计时器

    QTimer* BGPlayTimer;//背景音乐循环播放间隔计时器

    QTimer* mBGmoveTimer;//背景移动计时器

    QTimer* setBackCreateTimer;//障碍物生成计时器
    QTimer* setBackMoveTimer;//障碍物移动计时器
    QTimer* setBackCreateCoolDownTimer;//障碍物生成冷却计时器

    QTimer* awardCreateTimer;//奖励生成计时器
    QTimer* awardMoveTimer;//奖励移动计时器
    QTimer* awardCreateCoolDownTimer;//奖励生成冷却计时器

    //QTimer* awardMeetSetbackTimer;//奖励和障碍物相遇计时器

    //游戏开始函数
    void gameInit();

    //加载场景
    void LoadStartScene();//游戏开始场景
    void LoadInterpretScene();//游戏说明场景
    void LoadInstallScene();//游戏设置场景
    void LoadGameScene();//游戏场景

    //加载游戏人物
    void loadGameRole();//加载游戏人物形象
    void updateRole();//在游戏人物的运动状况变化时，进行游戏人物形象的更新

    //加载障碍物对象
    void setBackCreate();

    //加载奖励对象
    void awardCreate();

    //设置移动函数
    void BGmove();//设置游戏背景移动函数
    void mRoleMove();//设置人物移动函数
    void roleJump();//设置人物跳跃函数
    //void roleCrouch();//设置人物下蹲函数

    //判断人物状态
    bool isGround();//是否在地面上
    //bool isCrouch();//是否在下蹲状态

    //用滑动条控制音量函数
    void MusicVolumeSet(int value);

    //设置障碍物碰撞相关函数
    void checkCollisions();//碰撞检测
    void handleCollisions(setBack* setback);//碰撞处理：减少生命值

    //设置奖励碰撞相关函数
    void checkAwardCollisions();//碰撞检测
    void handleAwardCollision(award* Awd);//碰撞处理函数；增加奖励值

    //设置奖励和障碍物相遇函数
    void awardMeetSetback(QList<setBack*> _setbacklist,QList<award*> _awardlist);

    //设置游戏结束函数
    void stopTimer();
    void resetGame();
    void gameOver();

    Ui::Widget *ui;
};

#endif // WIDGET_H
